package com.redepronik.negosys.invfac.entity;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.validation.constraints.DecimalMax;
import javax.validation.constraints.DecimalMin;
import javax.validation.constraints.Min;

import org.hibernate.annotations.IndexColumn;
import org.hibernate.validator.constraints.Length;

/**
 * The persistent class for the producto database table.
 * 
 */
@Entity
@Table(schema = "invfac", name = "producto")
@NamedQuery(name = "Producto.findAll", query = "SELECT p FROM Producto p")
public class Producto implements Serializable {
	private static final long serialVersionUID = 1L;

	@Id
	@SequenceGenerator(allocationSize = 1, name = "PRODUCTO_PRODUCTOID_GENERATOR", sequenceName = "INVFAC.PRODUCTO_PRODUCTOID_SEQ")
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "PRODUCTO_PRODUCTOID_GENERATOR")
	@Column(unique = true, nullable = false)
	private Long productoid;

	@Column(nullable = false)
	private Boolean activo;

	@Min(value = 1, message = "INGRESE LA CANTIDAD MÍNIMA")
	@Column(nullable = false)
	private Integer cantidadminima;

	@Length(min = 3, max = 50, message = "INGRESE EL CODIGO AUXILIAR. COMO MÍNIMO 3 CARACTERES")
	@Column(nullable = false, length = 50)
	private String codigo1;

	@Length(min = 3, max = 50, message = "INGRESE EL CODIGO 2. COMO MÍNIMO 3 CARACTERES")
	@Column(nullable = false, length = 50)
	private String codigo2;

	@Column(precision = 20, scale = 10)
	private BigDecimal descuento;

	@Length(min = 3, max = 50, message = "INGRESE EL EAN. COMO MÍNIMO 3 CARACTERES")
	@Column(nullable = false, length = 50)
	private String ean;

	@Column(precision = 20, scale = 10)
	private BigDecimal ice;

	@Column(nullable = false)
	private Boolean iva;

	@Column(nullable = false, length = 1000)
	private String nombre;

	@Column(nullable = false, length = 1000)
	private String nombreimprimir;

	@DecimalMin(value = "0.00", message = "MINIMO 2 DECIMALES")
	@DecimalMax(value = "9999999999.9999999999", message = "MAXIMO 10 DECIMALES")
	@Column(nullable = false, precision = 20, scale = 10)
	private BigDecimal precio;

	// bi-directional many-to-one association to Detalleegreso
	@OneToMany(orphanRemoval = true, cascade = CascadeType.ALL, mappedBy = "producto")
	private List<Detalleegreso> detalleegresos;

	// bi-directional many-to-one association to Detalleingreso
	@OneToMany(orphanRemoval = true, cascade = CascadeType.ALL, mappedBy = "producto")
	private List<Detalleingreso> detalleingresos;

	// bi-directional many-to-one association to Detalletraspaso
	@OneToMany(orphanRemoval = true, cascade = CascadeType.ALL, mappedBy = "producto")
	private List<Detalletraspaso> detalletraspasos;

	// bi-directional many-to-one association to Kardex
	@OneToMany(orphanRemoval = true, cascade = CascadeType.ALL, mappedBy = "producto")
	private List<Kardex> kardexs;

	// bi-directional many-to-one association to Productocaracteristica
	@OneToMany(orphanRemoval = true, cascade = CascadeType.ALL, mappedBy = "producto")
	@IndexColumn(name = "orden", base = 1)
	private List<Productocaracteristica> productocaracteristicas;

	// bi-directional many-to-one association to Productounidad
	@OneToMany(orphanRemoval = true, cascade = CascadeType.ALL, mappedBy = "producto")
	@IndexColumn(name = "orden", base = 1)
	private List<Productounidad> productounidads;

	// bi-directional many-to-one association to Tipoprecioproducto
	@OneToMany(orphanRemoval = true, cascade = CascadeType.ALL, mappedBy = "producto")
	@IndexColumn(name = "orden", base = 1)
	private List<TipoPrecioProducto> tipoPrecioProductos;

	// bi-directional many-to-one association to Grupo
	@ManyToOne
	@JoinColumn(name = "grupoid", nullable = false)
	private Grupo grupo;

	public Producto() {
	}

	public Detalleegreso addDetalleegreso(Detalleegreso detalleegreso) {
		getDetalleegresos().add(detalleegreso);
		detalleegreso.setProducto(this);

		return detalleegreso;
	}

	public Detalleingreso addDetalleingreso(Detalleingreso detalleingreso) {
		getDetalleingresos().add(detalleingreso);
		detalleingreso.setProducto(this);

		return detalleingreso;
	}

	public Detalletraspaso addDetalletraspaso(Detalletraspaso detalletraspaso) {
		getDetalletraspasos().add(detalletraspaso);
		detalletraspaso.setProducto(this);

		return detalletraspaso;
	}

	public Kardex addKardex(Kardex kardex) {
		getKardexs().add(kardex);
		kardex.setProducto(this);

		return kardex;
	}

	public Productocaracteristica addProductocaracteristica(
			Productocaracteristica productocaracteristica) {
		getProductocaracteristicas().add(productocaracteristica);
		productocaracteristica.setProducto(this);

		return productocaracteristica;
	}

	public Productounidad addProductounidad(Productounidad productounidad) {
		getProductounidads().add(productounidad);
		productounidad.setProducto(this);

		return productounidad;
	}

	public TipoPrecioProducto addTipoPrecioProducto(
			TipoPrecioProducto tipoPrecioProductos) {
		getTipoPrecioProductos().add(tipoPrecioProductos);
		tipoPrecioProductos.setProducto(this);

		return tipoPrecioProductos;
	}

	public Boolean getActivo() {
		return this.activo;
	}

	public Integer getCantidadminima() {
		return this.cantidadminima;
	}

	public String getCodigo1() {
		return this.codigo1;
	}

	public String getCodigo2() {
		return this.codigo2;
	}

	public BigDecimal getDescuento() {
		return this.descuento;
	}

	public List<Detalleegreso> getDetalleegresos() {
		return this.detalleegresos;
	}

	public List<Detalleingreso> getDetalleingresos() {
		return this.detalleingresos;
	}

	public List<Detalletraspaso> getDetalletraspasos() {
		return this.detalletraspasos;
	}

	public String getEan() {
		return this.ean;
	}

	public Grupo getGrupo() {
		return this.grupo;
	}

	public BigDecimal getIce() {
		return this.ice;
	}

	public Boolean getIva() {
		return this.iva;
	}

	public List<Kardex> getKardexs() {
		return this.kardexs;
	}

	public String getNombre() {
		return this.nombre;
	}

	public String getNombreimprimir() {
		return nombreimprimir;
	}

	public BigDecimal getPrecio() {
		return this.precio;
	}

	public List<Productocaracteristica> getProductocaracteristicas() {
		return this.productocaracteristicas;
	}

	public Long getProductoid() {
		return this.productoid;
	}

	public List<Productounidad> getProductounidads() {
		return this.productounidads;
	}

	public List<TipoPrecioProducto> getTipoPrecioProductos() {
		return this.tipoPrecioProductos;
	}

	public Detalleegreso removeDetalleegreso(Detalleegreso detalleegreso) {
		getDetalleegresos().remove(detalleegreso);
		detalleegreso.setProducto(null);

		return detalleegreso;
	}

	public Detalleingreso removeDetalleingreso(Detalleingreso detalleingreso) {
		getDetalleingresos().remove(detalleingreso);
		detalleingreso.setProducto(null);

		return detalleingreso;
	}

	public Detalletraspaso removeDetalletraspaso(Detalletraspaso detalletraspaso) {
		getDetalletraspasos().remove(detalletraspaso);
		detalletraspaso.setProducto(null);

		return detalletraspaso;
	}

	public Kardex removeKardex(Kardex kardex) {
		getKardexs().remove(kardex);
		kardex.setProducto(null);

		return kardex;
	}

	public Productocaracteristica removeProductocaracteristica(
			Productocaracteristica productocaracteristica) {
		getProductocaracteristicas().remove(productocaracteristica);
		productocaracteristica.setProducto(null);

		return productocaracteristica;
	}

	public Productounidad removeProductounidad(Productounidad productounidad) {
		getProductounidads().remove(productounidad);
		productounidad.setProducto(null);

		return productounidad;
	}

	public TipoPrecioProducto removeTipoPrecioProducto(
			TipoPrecioProducto tipoPrecioProductos) {
		getTipoPrecioProductos().remove(tipoPrecioProductos);
		tipoPrecioProductos.setProducto(null);

		return tipoPrecioProductos;
	}

	public void setActivo(Boolean activo) {
		this.activo = activo;
	}

	public void setCantidadminima(Integer cantidadminima) {
		this.cantidadminima = cantidadminima;
	}

	public void setCodigo1(String codigo1) {
		this.codigo1 = codigo1;
	}

	public void setCodigo2(String codigo2) {
		this.codigo2 = codigo2;
	}

	public void setDescuento(BigDecimal descuento) {
		this.descuento = descuento;
	}

	public void setDetalleegresos(List<Detalleegreso> detalleegresos) {
		this.detalleegresos = detalleegresos;
	}

	public void setDetalleingresos(List<Detalleingreso> detalleingresos) {
		this.detalleingresos = detalleingresos;
	}

	public void setDetalletraspasos(List<Detalletraspaso> detalletraspasos) {
		this.detalletraspasos = detalletraspasos;
	}

	public void setEan(String ean) {
		this.ean = ean;
	}

	public void setGrupo(Grupo grupo) {
		this.grupo = grupo;
	}

	public void setIce(BigDecimal ice) {
		this.ice = ice;
	}

	public void setIva(Boolean iva) {
		this.iva = iva;
	}

	public void setKardexs(List<Kardex> kardexs) {
		this.kardexs = kardexs;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public void setNombreimprimir(String nombreimprimir) {
		this.nombreimprimir = nombreimprimir;
	}

	public void setPrecio(BigDecimal precio) {
		this.precio = precio;
	}

	public void setProductocaracteristicas(
			List<Productocaracteristica> productocaracteristicas) {
		this.productocaracteristicas = productocaracteristicas;
	}

	public void setProductoid(Long productoid) {
		this.productoid = productoid;
	}

	public void setProductounidads(List<Productounidad> productounidads) {
		this.productounidads = productounidads;
	}

	public void setTipoPrecioProductos(
			List<TipoPrecioProducto> tipoPrecioProductos) {
		this.tipoPrecioProductos = tipoPrecioProductos;
	}

}